home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 676-700 / 680 / sattrack / ifflib20.lzh / Examples / AnimExample.c < prev    next >
C/C++ Source or Header  |  1990-07-31  |  4KB  |  130 lines

  1. /*
  2.     AnimExample.c - A simple DPaint animation player by Christian A. Weber.
  3.     This program is in the public domain, use and abuse at your own risk.
  4.     Requires the iff.library in the LIBS: dircetory. Compiles with
  5.     Lattice C V5.04 (LC -v -L AnimExample), should also work with Manx.
  6. */
  7.  
  8. #include <exec/types.h>
  9. #include <graphics/gfxbase.h>
  10. #include <intuition/intuition.h>
  11. #include <libraries/iff.h>            /* Our iff header file */
  12.  
  13. struct Library *IntuitionBase,*IFFBase, *OpenLibrary();
  14. struct GfxBase *GfxBase;
  15.  
  16. struct NewScreen ns =
  17. {
  18.     0,0,0,0,0,0,0, NULL, CUSTOMSCREEN|SCREENBEHIND|SCREENQUIET, NULL,
  19.     (STRPTR)"Anim Player Example by Christian A. Weber", NULL, NULL
  20. };
  21.  
  22. struct Screen *screen1,*screen2, *OpenScreen();
  23. ULONG *ifffile;
  24.  
  25. void SetOverscan(screen)        /* Adjust the screen position for overscan */
  26. register struct Screen *screen;
  27. {
  28.     register WORD cols,rows,x=screen->Width,y=screen->Height;
  29.     register struct ViewPort *vp=&(screen->ViewPort);
  30.  
  31.     cols = GfxBase->NormalDisplayColumns>>1;
  32.     rows = GfxBase->NormalDisplayRows; if(rows>300) rows>>=1;
  33.     x -= cols; if(vp->Modes & HIRES) x -= cols;
  34.     y -= rows; if(vp->Modes & LACE)  y -= rows;
  35.     x >>=1; if(x<0) x=0; y >>=1; if(y<0) y=0; if(y>32) y=32;
  36.  
  37.     if(vp->Modes & HAM)    /* Correct overscan HAM color distortions */
  38.     {
  39.         if(GfxBase->ActiView->DxOffset-x < 96)
  40.             x=GfxBase->ActiView->DxOffset-96;
  41.     }
  42.     vp->DxOffset = -x; vp->DyOffset = -y;
  43.     MakeScreen(screen); RethinkDisplay();
  44. }
  45.  
  46. void Fail(text)            /* Print error message, free resources and exit */
  47. char *text;
  48. {
  49.     printf("%s, IFFError = %ld\n",text,IFFError());
  50.  
  51.     if(ifffile) CloseIFF(ifffile);
  52.     if(screen1) CloseScreen(screen1);
  53.     if(screen2) CloseScreen(screen2);
  54.  
  55.     if(IFFBase) CloseLibrary(IFFBase);    /* MUST ALWAYS BE CLOSED !! */
  56.     CloseLibrary(IntuitionBase);
  57.     CloseLibrary(GfxBase);
  58.     exit(0);
  59. }
  60.  
  61. void main(argc,argv)
  62. int argc;
  63. char **argv;
  64. {
  65.     register LONG count,i,delay;
  66.     register ULONG *form,*loopform;
  67.     struct BitMapHeader *bmhd;
  68.     UWORD colortable[128];
  69.  
  70.     if((argc != 4) || !strcmp(argv[1],"?")) {
  71.         printf("Format: %s filename <delaytime> <# of loops>\n",argv[0]);
  72.         exit(20);
  73.     }
  74.  
  75.     GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0L);
  76.     IntuitionBase = OpenLibrary("intuition.library",0L);
  77.  
  78.     if(!(IFFBase = OpenLibrary(IFFNAME,IFFVERSION))) {
  79.         printf("Copy the iff.library to your LIBS: directory!\n");
  80.         exit(10);
  81.     }
  82.  
  83.     if(!(ifffile=OpenIFF(argv[1]))) Fail("Error opening file");
  84.     form=ifffile+3; /* Skip FORM....ANIM */
  85.  
  86.     if(ifffile[2] != ID_ANIM) Fail("Not an ANIM file");
  87.     if(!(bmhd=GetBMHD(form))) Fail("BitMapHeader not found");
  88.  
  89.     ns.Width     = bmhd->w;
  90.     ns.Height    = bmhd->h;
  91.     ns.Depth     = bmhd->nPlanes;
  92.     ns.ViewModes = GetViewModes(form);
  93.  
  94.     if(!(screen1 = OpenScreen(&ns))) Fail("Can't open screen 1!");
  95.     if(!(screen2 = OpenScreen(&ns))) Fail("Can't open screen 2!");
  96.     SetOverscan(screen1); SetOverscan(screen2);
  97.  
  98.     count = GetColorTab(form,colortable);
  99.     if(count>32L) count = 32L; /* Some HAM pictures have 64 colors ?! */
  100.     LoadRGB4(&(screen1->ViewPort),colortable,count);
  101.     LoadRGB4(&(screen2->ViewPort),colortable,count);
  102.  
  103.     /* Decode and display the first frame: */
  104.     if(!DecodePic(form,&screen1->BitMap)) Fail("Can't decode picture");
  105.     DecodePic(form,&screen2->BitMap);
  106.     ScreenToFront(screen2);
  107.     if((delay=atol(argv[2])) > 1) Delay(delay);
  108.  
  109.     /* Decode and display the second frame: copy and modify the first one */
  110.     form=FindChunk(ifffile+3,0L);        /* First FORM containing a DLTA */
  111.     if(!ModifyFrame(form,&screen1->BitMap)) Fail("Can't decode frame");
  112.     ScreenToFront(screen1);
  113.     if(delay>1) Delay(delay);
  114.  
  115.     loopform=FindChunk(form,0L);        /* FORM to start loop at */
  116.     for(i=0; i<atol(argv[3]); ++i)        /* Loop n times */
  117.     {
  118.         for(form=loopform; *form==ID_FORM; form=FindChunk(form,0L))
  119.         {
  120.             register struct Screen *dummy;
  121.             if(!ModifyFrame(form,&screen2->BitMap)) Fail("Can't decode frame");
  122.             dummy=screen1; screen1=screen2; screen2=dummy;    /* Flip screens */
  123.             ScreenToFront(screen1);
  124.             if(delay>1) Delay(delay);
  125.         }
  126.     }
  127.     Fail("done");     /* Normal termination */
  128. }
  129.  
  130.